package gcp.testes;

import static org.junit.Assert.assertEquals;
import gcp.Jogo;
import gcp.enums.ClassificacaoEtaria;
import gcp.enums.ItemEstado;
import gcp.enums.TipoDeJogo;

import org.junit.Before;
import org.junit.Test;

/**
 * Classe de teste de Jogo
 * @author catharine
 */
public class JogoTeste {
private Jogo jogo1, jogo2, jogo3, jogo4;

	/**
	 * Testa construtor de Jogo
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */
	@Before
	public void setUp() throws Exception {
		jogo1 = new Jogo("Top Gear 2", "Nitendo", 1997, ClassificacaoEtaria.LIVRE, TipoDeJogo.CORRIDA, ItemEstado.COMIGO, "bom");
		jogo2 = new Jogo("MarioBros", "Nintendo", 1985 , ClassificacaoEtaria.LIVRE, TipoDeJogo.INDEFINIDO, ItemEstado.EMPRESTADO,"legal");
		jogo3 = new Jogo("Sonic", "Sega", 1995 , ClassificacaoEtaria.LIVRE , TipoDeJogo.INDEFINIDO, ItemEstado.COMIGO, "interessante");
		jogo4 = new Jogo("The Beatles: Rock Band", "MTV Games", 2009, ClassificacaoEtaria.DOZE, TipoDeJogo.INDEFINIDO, ItemEstado.FALTANDO, "otimo");
	}

	 /**
	 * Testa excecao parametro Titulo null
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */
	@Test(expected = Exception.class)
	public void testaTituloNull() throws Exception {
		new Jogo(null, "Nitendo", 1997, ClassificacaoEtaria.LIVRE, TipoDeJogo.CORRIDA, ItemEstado.COMIGO,null);
		new Jogo("MarioBros", "Nintendo", 1985 , ClassificacaoEtaria.LIVRE, TipoDeJogo.INDEFINIDO, ItemEstado.EMPRESTADO,null);
	}

	 /**
	 * Testa excecao parametro Titulo vazio
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */
	@Test(expected = Exception.class)
	public void testaTituloVazio() throws Exception {
		new Jogo("Top Gear 2", "Nitendo", 1997, ClassificacaoEtaria.LIVRE, TipoDeJogo.CORRIDA, ItemEstado.COMIGO,null);
		new Jogo("", "Nintendo", 1985 , ClassificacaoEtaria.LIVRE, TipoDeJogo.INDEFINIDO, ItemEstado.EMPRESTADO,null);
	}

	 /**
	 * Testa excecao parametro Quem publicou null
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */
	@Test(expected = Exception.class)
	public void testaQuemPublicouNulo() throws Exception {
		new Jogo("Top Gear 2", "Nitendo", 1997, ClassificacaoEtaria.LIVRE, TipoDeJogo.CORRIDA, ItemEstado.COMIGO,null);
		new Jogo("MarioBros", null, 1985 , ClassificacaoEtaria.LIVRE, TipoDeJogo.INDEFINIDO, ItemEstado.EMPRESTADO,null);;
	}

	 /**
	 * Testa excecao parametro Quem publicou vazio
	 * @throws Exception  Lancada quando algum parametro for invalido.
	 */
	@Test(expected = Exception.class)
	public void testaQuemPublicouVazio() throws Exception {
		new Jogo("Top Gear 2", "", 1997, ClassificacaoEtaria.LIVRE, TipoDeJogo.CORRIDA, ItemEstado.COMIGO,null);
		new Jogo("MarioBros", "Nintendo", 1985 , ClassificacaoEtaria.LIVRE, TipoDeJogo.INDEFINIDO, ItemEstado.EMPRESTADO,null);	
	}

	 /**
	 * Testa excecao parametro Ano de publicacao igual a zero
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */
	@Test(expected = Exception.class)
	public void testaAnoZero() throws Exception {
		new Jogo("Top Gear 2", "Nitendo", 0, ClassificacaoEtaria.LIVRE, TipoDeJogo.CORRIDA, ItemEstado.COMIGO,null);
		new Jogo("MarioBros", "Nintendo", 1985 , ClassificacaoEtaria.LIVRE, TipoDeJogo.INDEFINIDO, ItemEstado.EMPRESTADO,null);
	}
	
	 /**
	 * Testa excecao parametro ano de publicacao negativo
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */ 
	@Test(expected = Exception.class)
	public void testaAnoNegativo() throws Exception {
		new Jogo("Top Gear 2", "Nitendo", 1997, ClassificacaoEtaria.LIVRE, TipoDeJogo.CORRIDA, ItemEstado.COMIGO,null);
		new Jogo("MarioBros", "Nintendo", -1985 , ClassificacaoEtaria.LIVRE, TipoDeJogo.INDEFINIDO, ItemEstado.EMPRESTADO,null);}

	 /**
	 * Testa get de Titulos dos jogos
	 * @throws Exception Lançada quando algum parâmetro for inválido.
	 */
	@Test
	public void testaGetTitulos() {
		assertEquals("Top Gear 2", jogo1.getTitulo());
		assertEquals("MarioBros", jogo2.getTitulo());
		assertEquals("Sonic", jogo3.getTitulo());
		assertEquals("The Beatles: Rock Band", jogo4.getTitulo());
	}

	 /**
	 * Testa set e get de Nome dos jogos
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */
	@Test
	public void testaSetEGetNomes() throws Exception {
		jogo1.setTitulo("Pac Man");
		jogo2.setTitulo("Crash");
		jogo3.setTitulo("Homen Aranha");
		jogo4.setTitulo("Mortal Kombat");
		assertEquals("Pac Man", jogo1.getTitulo());
		assertEquals("Crash", jogo2.getTitulo());
		assertEquals("Homen Aranha", jogo3.getTitulo());
		assertEquals("Mortal Kombat", jogo4.getTitulo());
	}
	
	 /**
	 * Testa get de Quem publicou os jogos
	 */
	@Test
	public void testagetQuemPublicou() {
		assertEquals("Nitendo", jogo1.getQuemPublicou());
		assertEquals("Nintendo", jogo2.getQuemPublicou());
		assertEquals("Sega", jogo3.getQuemPublicou());
		assertEquals("MTV Games", jogo4.getQuemPublicou());
	}

	 /**
	 * Testa set e get de Quem publicou dos jogos
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */
	@Test
	public void testaSetEGetQuemPublicou() throws Exception {
		jogo1.setQuemPublicou("Sega");
		jogo2.setQuemPublicou("Sony");
		jogo3.setQuemPublicou("Wii");
		jogo4.setQuemPublicou("Mega Drive/ Sega");
		assertEquals("Sega", jogo1.getQuemPublicou());
		assertEquals("Sony", jogo2.getQuemPublicou());
		assertEquals("Wii", jogo3.getQuemPublicou());
		assertEquals("Mega Drive/ Sega", jogo4.getQuemPublicou());
	}
	
	 /**
	 * Testa get de ano de publicacao do jogo
	 */
	@Test
	public void testaGetAno() {
		assertEquals(1997, jogo1.getAno());
		assertEquals(1985, jogo2.getAno());
		assertEquals(1995, jogo3.getAno());
		assertEquals(2009, jogo4.getAno());
	}

	 /**
	 * Testa set e get de Ano de publicacao dos jogos
	 */
	@Test
	public void testaSetEGetAno() {
		jogo1.setAno(1960);
		jogo2.setAno(1970);
		jogo3.setAno(1980);
		jogo4.setAno(1990);
		assertEquals(1960, jogo1.getAno());
		assertEquals(1970, jogo2.getAno());
		assertEquals(1980, jogo3.getAno());
		assertEquals(1990, jogo4.getAno());
	}
	

	 /**
	 * Testa set e get de ESRB dos jogos
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */
	@Test
	public void testaSetEGetIdade() throws Exception {
		jogo1.setClassificacaoEtaria(ClassificacaoEtaria.DESCONHECIDO);
		jogo2.setClassificacaoEtaria(ClassificacaoEtaria.DEZESSEIS);
		jogo3.setClassificacaoEtaria(ClassificacaoEtaria.LIVRE);
		jogo4.setClassificacaoEtaria(ClassificacaoEtaria.DEZOITO);
		assertEquals(ClassificacaoEtaria.DESCONHECIDO, jogo1.getClassificacaoEtaria());
		assertEquals(ClassificacaoEtaria.DEZESSEIS, jogo2.getClassificacaoEtaria());
		assertEquals(ClassificacaoEtaria.LIVRE, jogo3.getClassificacaoEtaria());
		assertEquals(ClassificacaoEtaria.DEZOITO, jogo4.getClassificacaoEtaria());
	}

	 /**
	 * Testa Estado dos jogos
	 * @throws Exception  Lancada quando algum parametro for invalido.
	 */
	@Test
	 public void testaItemEstado() throws Exception {
	    assertEquals(ItemEstado.COMIGO, jogo1.getItemEstado());
		assertEquals(ItemEstado.EMPRESTADO, jogo2.getItemEstado());
		assertEquals(ItemEstado.COMIGO, jogo3.getItemEstado());
		assertEquals(ItemEstado.FALTANDO, jogo4.getItemEstado());
	 }

	 /**
	 * Testa get de Titulos dos jogos
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */
	@Test
	 public void testaSetEGetItemEstado() throws Exception {
	 	jogo1.setItemEstado(ItemEstado.EMPRESTADO);
		jogo2.setItemEstado(ItemEstado.COMIGO);
		jogo3.setItemEstado(ItemEstado.A_DEVOLVER);
		jogo4.setItemEstado(ItemEstado.FALTANDO);
		assertEquals(ItemEstado.EMPRESTADO, jogo1.getItemEstado());
		assertEquals(ItemEstado.COMIGO, jogo2.getItemEstado());
		assertEquals(ItemEstado.A_DEVOLVER, jogo3.getItemEstado());
		assertEquals(ItemEstado.FALTANDO, jogo4.getItemEstado());
	 }

	 /**
	 * Testa de Tipo do jogo
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */
	@Test
	 public void testaTipoDeJogo() throws Exception {
	    assertEquals(TipoDeJogo.CORRIDA, jogo1.getTipoDeJogo());
		assertEquals(TipoDeJogo.INDEFINIDO, jogo2.getTipoDeJogo());
		assertEquals(TipoDeJogo.INDEFINIDO, jogo3.getTipoDeJogo());
		assertEquals(TipoDeJogo.INDEFINIDO, jogo4.getTipoDeJogo());
	 }

	 /**
	 * Testa set e get de Tipo de jogo
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */
	@Test
	 public void testaSetEGetTipoDeJogo() throws Exception {
	 	jogo1.setTipoDeJogo(TipoDeJogo.ARCADE);
		jogo2.setTipoDeJogo(TipoDeJogo.AVENTURA);
		jogo3.setTipoDeJogo(TipoDeJogo.ESPORTE);
		jogo4.setTipoDeJogo(TipoDeJogo.LUTA);
		assertEquals(TipoDeJogo.ARCADE, jogo1.getTipoDeJogo());
		assertEquals(TipoDeJogo.AVENTURA, jogo2.getTipoDeJogo());
		assertEquals(TipoDeJogo.ESPORTE, jogo3.getTipoDeJogo());
		assertEquals(TipoDeJogo.LUTA, jogo4.getTipoDeJogo());
	 }
}